Android TalkBack 和 fragment 堆栈
全部标签 我目前正在Linux上玩ARM汇编作为学习练习。我正在使用“裸”程序集,即没有libcrt或libgcc。谁能告诉我在调用第一条指令之前堆栈指针和其他寄存器在程序开始时的状态信息?显然pc/r15指向_start,其余似乎都初始化为0,但有两个异常(exception);sp/r13指向一个远离我的程序的地址,而r1指向一个稍微高一点的地址。所以对于一些可靠的问题:r1中的值是多少?sp中的值是否是内核分配的合法栈?如果不是,分配堆栈的首选方法是什么?使用brk还是分配静态.bss部分?如有任何指点,我们将不胜感激。 最佳答案 既然
我可以在Linux上配置进入核心转储的内容吗?我想获得类似Windows小型转储的信息(应用程序崩溃时有关堆栈帧的最少信息)。我知道您可以使用ulimit为核心文件设置最大大小,但这不允许我控制核心内部的内容(即不能保证如果我将限制设置为64kb它例如,将转储堆栈的最后16页)。此外,如果可能的话,我想以编程方式(通过代码)设置它。我查看了mancore提到的/proc/PID/coredump_filter文件,但对于我的目的来说它似乎过于粗糙。提供一些背景信息:出于多种原因,我需要微型核心文件:我需要通过网络为众多(数千)客户收集它们;此外,这些是带有少量SD卡的嵌入式设备,以及用
我可以在Linux上配置进入核心转储的内容吗?我想获得类似Windows小型转储的信息(应用程序崩溃时有关堆栈帧的最少信息)。我知道您可以使用ulimit为核心文件设置最大大小,但这不允许我控制核心内部的内容(即不能保证如果我将限制设置为64kb它例如,将转储堆栈的最后16页)。此外,如果可能的话,我想以编程方式(通过代码)设置它。我查看了mancore提到的/proc/PID/coredump_filter文件,但对于我的目的来说它似乎过于粗糙。提供一些背景信息:出于多种原因,我需要微型核心文件:我需要通过网络为众多(数千)客户收集它们;此外,这些是带有少量SD卡的嵌入式设备,以及用
我需要查找给定地址是在堆中还是在堆栈中。在Linux中有可靠的方法来做到这一点吗?我已经考虑过以下方法,假设堆栈将向下增长并且堆将向堆栈增长。这个解决方案有多可靠?我们不使用gccsplit-stack。is_stack(void*addr){inta;if(&a[编辑-我看到了一个类似的问题,但更多的是理论性质] 最佳答案 首先,您的process中可能有多个堆栈,特别是如果它是多线程的(并且某些库可以在您不要求的情况下启动线程)。还有你的过程'virtualaddressspace可能有比堆和堆栈更多的段。您可能会解析/proc
我需要查找给定地址是在堆中还是在堆栈中。在Linux中有可靠的方法来做到这一点吗?我已经考虑过以下方法,假设堆栈将向下增长并且堆将向堆栈增长。这个解决方案有多可靠?我们不使用gccsplit-stack。is_stack(void*addr){inta;if(&a[编辑-我看到了一个类似的问题,但更多的是理论性质] 最佳答案 首先,您的process中可能有多个堆栈,特别是如果它是多线程的(并且某些库可以在您不要求的情况下启动线程)。还有你的过程'virtualaddressspace可能有比堆和堆栈更多的段。您可能会解析/proc
作为asm的初学者,我正在查看gcc-S生成的asm代码来学习。为什么gcc4.x在调用方法时默认为堆栈保留8个字节?func18是空函数,没有返回值,没有参数,没有定义局部变量。我不明白为什么这里保留8个字节(任何论坛/网站都没有提及原因,人们似乎认为这是理所当然的)是为了%ebp只是推送吗?或返回类型?!非常感谢!.globl_func18_func18:pushl%ebpmovl%esp,%ebpsubl$8,%esp.text 最佳答案 一些指令要求某些数据类型与16字节边界对齐(特别是SSE数据类型__m128)。为了满足
作为asm的初学者,我正在查看gcc-S生成的asm代码来学习。为什么gcc4.x在调用方法时默认为堆栈保留8个字节?func18是空函数,没有返回值,没有参数,没有定义局部变量。我不明白为什么这里保留8个字节(任何论坛/网站都没有提及原因,人们似乎认为这是理所当然的)是为了%ebp只是推送吗?或返回类型?!非常感谢!.globl_func18_func18:pushl%ebpmovl%esp,%ebpsubl$8,%esp.text 最佳答案 一些指令要求某些数据类型与16字节边界对齐(特别是SSE数据类型__m128)。为了满足
我正在使用gdb命令“附加”来调试进程但是在进程崩溃(sigkill)之后我看不到堆栈跟踪(gdb中的“bt”命令):(gdb)BT没有堆栈。进程终止后如何查看堆栈跟踪? 最佳答案 通过确保ulimit-c不显示核心大小为0,将您的shell设置为转储核心。如果显示为0,则运行ulimit-cunlimited.接下来,重新运行您的程序,直到它崩溃并转储核心,然后调用:gdb/path/to/executable/path/to/core并键入bt以获取堆栈跟踪。此外,您还需要在打开调试信息的情况下编译可执行文件。如果您使用的是gc
我正在使用gdb命令“附加”来调试进程但是在进程崩溃(sigkill)之后我看不到堆栈跟踪(gdb中的“bt”命令):(gdb)BT没有堆栈。进程终止后如何查看堆栈跟踪? 最佳答案 通过确保ulimit-c不显示核心大小为0,将您的shell设置为转储核心。如果显示为0,则运行ulimit-cunlimited.接下来,重新运行您的程序,直到它崩溃并转储核心,然后调用:gdb/path/to/executable/path/to/core并键入bt以获取堆栈跟踪。此外,您还需要在打开调试信息的情况下编译可执行文件。如果您使用的是gc
在Linux上,使用C,假设我有一个动态确定的n命名我必须存储在数组中的元素数量(intmy_array[n])只是在很短的时间内,比如一个函数调用,被调用函数只使用很少的内存(大约一百字节)。大部分n很少,大约十分之一。但有时n可能很大,多达1000或1'000'000。如何计算,我的堆栈是否可以容纳n*o+p个字节而不溢出?基本上:我的堆栈中还剩下多少字节? 最佳答案 的确,checkingavailablestack问题给出了很好的答案。但更务实的答案是:不要在调用堆栈上分配大数据。在您的情况下,您可以以不同方式处理n时的情况